package algorithm.middle;

import java.util.*;

/**
 * @author 江岸
 * @version V1.0
 * @ClassName: Calculate227
 * @description: 给你一个字符串表达式 s ，请你实现一个基本计算器来计算并返回它的值。
 *
 * 整数除法仅保留整数部分。
 *
 *227. 基本计算器 II
 *
 * 示例 1：
 *
 * 输入：s = "3+2*2"
 * 输出：7
 *
 * 示例 2：
 *
 * 输入：s = " 3/2 "
 * 输出：1
 *
 * 示例 3：
 *
 * 输入：s = " 3+5 / 2 "
 * 输出：5
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/basic-calculator-ii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @date 2021/3/119:24
 * @since V1.0
 */
public class Calculate227 {
    public static void main(String[] args) {
        //System.out.println(calculate("-2+3+5/2-9"));
    }

    public static int calculate(String s) {
        String str = s.replace(" ", "");
        List<String> list =  new ArrayList<>();
        int n=0;
        for (int i=0;i<str.length();i++){
            if (str.charAt(i) == '+'||str.charAt(i) == '-'||str.charAt(i) == '*' ||str.charAt(i) == '/'){
                //符号
                if (!str.substring(n,i).equals("")){
                    list.add(str.substring(n,i));
                }
                list.add(str.charAt(i)+"");
                n=i+1;
            }
        }
        if (!str.substring(n).equals("")){
            list.add(str.substring(n));
        }
        Stack<Integer> stack = new Stack<>();
        if (list.get(0).equals("-")){
            list.add(0,"0");
        }
        System.out.println(list);
        for (int i=0;i<list.size();i++){
            if (list.get(i).equals("*")){
                stack.push(Integer.parseInt(list.get(++i))*stack.pop());
            }else if (list.get(i).equals("/")){
                stack.push(stack.pop()/Integer.parseInt(list.get(++i)));
            }else if (list.get(i).equals("-")){
                list.set(i+1,-1*Integer.parseInt(list.get(i+1))+"");
            }else if (list.get(i).equals("+")){

            }else {
                stack.push(Integer.parseInt(list.get(i)));
            }
        }
        System.out.println(stack);
        int res = 0;
        for (Integer item:stack){
            res+=item;
        }
        return res;
    }

    public int 官方题解(String s) {
        Deque<Integer> stack = new LinkedList<Integer>();
        char preSign = '+';
        int num = 0;
        int n = s.length();
        for (int i = 0; i < n; ++i) {
            if (Character.isDigit(s.charAt(i))) {
                num = num * 10 + s.charAt(i) - '0';
            }
            if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) {
                switch (preSign) {
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        stack.push(stack.pop() * num);
                        break;
                    default:
                        stack.push(stack.pop() / num);
                }
                preSign = s.charAt(i);
                num = 0;
            }
        }
        int ans = 0;
        while (!stack.isEmpty()) {
            ans += stack.pop();
        }
        return ans;
    }


}
